"""
后端服务运行脚本
功能：启动语音情感识别API服务
参数：端口号、主机地址等运行配置
使用场景：开发和生产环境的服务启动
运行方法：python run.py 或 python run.py --port 8001
"""

import argparse
import uvicorn
import sys
import os
import signal
import atexit

# 添加当前目录到Python路径
sys.path.append(os.path.dirname(os.path.abspath(__file__)))

from core.config import settings
from core.port_checker import ensure_port_available

def signal_handler(signum, frame):
    """
    信号处理器：处理Ctrl+C等中断信号
    参数：signum - 信号编号，frame - 当前栈帧
    功能：优雅地停止服务
    """
    print("\n" + "=" * 60)
    print("🛑 收到中断信号，正在优雅停止服务...")
    print("=" * 60)
    print("✅ 服务已停止")
    sys.exit(0)

def cleanup():
    """
    清理函数：程序退出时执行
    功能：清理临时文件和资源
    """
    print("🧹 清理资源完成")

def main():
    """
    主函数：解析命令行参数并启动服务
    """
    parser = argparse.ArgumentParser(description='启动语音情感识别API服务')
    parser.add_argument('--host', type=str, default=settings.HOST, 
                       help=f'服务器主机地址 (默认: {settings.HOST})')
    parser.add_argument('--port', type=int, default=settings.PORT, 
                       help=f'服务器端口号 (默认: {settings.PORT})')
    parser.add_argument('--reload', action='store_true', 
                       help='启用自动重载 (开发模式)')
    parser.add_argument('--workers', type=int, default=1, 
                       help='工作进程数量 (生产环境)')
    
    args = parser.parse_args()
    
    # 注册信号处理器
    signal.signal(signal.SIGINT, signal_handler)   # Ctrl+C
    signal.signal(signal.SIGTERM, signal_handler)  # 终止信号
    
    # 注册退出清理函数
    atexit.register(cleanup)
    
    print("=" * 60)
    print("🎙️  语音情感识别系统 - 后端API服务")
    print("=" * 60)
    print(f"服务地址: http://{args.host}:{args.port}")
    print(f"API文档: http://{args.host}:{args.port}/docs")
    print(f"健康检查: http://{args.host}:{args.port}/health")
    print("=" * 60)
    print("💡 按 Ctrl+C 可以优雅停止服务")
    print("=" * 60)
    
    # 检查端口可用性（禁用自动端口切换）
    ensure_port_available(args.host, args.port, "语音情感识别后端")
    
    # 启动服务
    try:
        uvicorn.run(
            "main:app",
            host=args.host,
            port=args.port,
            reload=args.reload or settings.DEBUG,
            workers=args.workers if not (args.reload or settings.DEBUG) else 1
        )
    except OSError as e:
        if "Address already in use" in str(e):
            print("❌ 端口被占用，服务启动失败！")
            print("=" * 60)
            print("🚫 自动端口切换已禁用！请手动解决端口冲突：")
            print(f"   1. 停止占用端口 {args.port} 的服务")
            print(f"   2. 或使用其他端口: python run.py --port {args.port + 1}")
            print(f"   3. 或运行停止脚本: ./stop.sh")
            print("=" * 60)
        else:
            print(f"❌ 启动失败: {e}")
        exit(1)

if __name__ == "__main__":
    main() 